'use strict';

module.exports = (option, app) => {
    return async (ctx, next) => {
        ctx.logger.debug('请求参数：', ctx.request.body);

        const authorization = ctx.header.authorization;

        if (!authorization) {
            ctx.response.tokenError(401);
            return;
        }
        const tokens = authorization.split(' ');
        try {
            if (!/^Bearer$/i.test(tokens[0])) {
                return;
            }
            const tokenInfo = await app.checkToken(tokens[1]);
            if (!tokenInfo) {
                ctx.response.tokenError(403);
                return;
            }

            // console.log('解析后的token信息：', tokenInfo);
            // 将当前用户信息存入 ctx 对象中，方便controller、service取到。
            ctx.curAdminUser = tokenInfo;
        } catch (error) {
            // 返回token错误信息
            switch (error.name) {
                case 'JsonWebTokenError':
                    ctx.response.tokenError(403);
                    return;
                case 'TokenExpiredError':
                    ctx.response.tokenError(403);
                    return;
                default:
                    ctx.response.tokenError(401);
                    return;
            }
        }
        // 进入下一个中间件
        await next();
    };
};
